package com.bbva.kyfb.kyfbutils.constantes;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.bbva.jee.arq.spring.core.contexto.ArqSpringContext;
import com.bbva.jee.arq.spring.core.gce.CodigoError;
import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoParseableExcepcion;

/**
 * The Class Util.
 */
public class Util {

    /** Variable LOG. */
    private static final I18nLog LOG =
        I18nLogFactory
            .getLogI18n(Util.class);

    /** The fecha proceso. */
    public static final String FECHA_PROCESO =
        "FP";

    /** The fecha creacion. */
    public static final String FECHA_CREACION =
        "FC";

    /** The est pdte firma. */
    public static final String EST_PDTE_FIRMA =
        "PF";

    /** The est fdo parcial. */
    public static final String EST_FDO_PARCIAL =
        "FP";

    /** The est pdte auditor. */
    public static final String EST_PDTE_AUDITOR =
        "PA";

    /** The est firmado. */
    public static final String EST_FIRMADO =
        "PE";

    /** The est env asistente. */
    public static final String EST_ENV_ASISTENTE =
        "FF";

    /** The est firmado enviado. */
    public static final String EST_FIRMADO_ENVIADO =
        "HO";

    /** The est eliminado usuario. */
    public static final String EST_ELIMINADO_USUARIO =
        "EL";

    /** The perfil activo. */
    public static final String PERFIL_ACTIVO =
        "A";

    /** The ordenante beneficiario. */
    public static final String ORDENANTE_BENEFICIARIO =
        "O";

    /** The usuario apoderado. */
    public static final String USUARIO_APODERADO =
        "P";

    /** The usuario auditor. */
    public static final String USUARIO_AUDITOR =
        "A";

    /** The usuario bbdd tlbh. */
    public static final String USUARIO_BBDD_TLBH =
        "VAR.DATABASE.USERNAME_TLBH";

    /** The usuario bbdd tlsb. */
    public static final String USUARIO_BBDD_TLSB =
        "VAR.DATABASE.USERNAME_TLSB";

    /** The xsn firmado. */
    public static final char XSN_FIRMADO =
        'S';

    /** The xsn firmado. */
    public static final char XSN_FIRMADO_N =
        'N';

    /** The asistente ok. */
    public static final String ASISTENTE_OK =
        "ASI0100000";

    /** The borrado. */
    public static final short BORRADO =
        8;

    /** The borrado int. */
    public static final Integer BORRADO_INT =
        0;

    /** Poderes de firma. */
    public static final String FIRMA_SOLIDARIO =
        "S";

    /** The FIRM a_ mancomunad o2. */
    public static final String FIRMA_MANCOMUNADO2 =
        "M2";

    /** The FIRM a_ mancomunad o3. */
    public static final String FIRMA_MANCOMUNADO3 =
        "M3";

    /** The FIRM a_ mancomunad o4. */
    public static final String FIRMA_MANCOMUNADO4 =
        "M4";

    /** The poder firma solidario. */
    public static final double PODER_FIRMA_SOLIDARIO =
        1;

    /**
     * The PODE r_ firm a_ mancomunad
     * o2.
     */
    public static final double PODER_FIRMA_MANCOMUNADO2 =
        0.5;

    /**
     * The PODE r_ firm a_ mancomunad
     * o3.
     */
    public static final double PODER_FIRMA_MANCOMUNADO3 =
        0.34;

    /**
     * The PODE r_ firm a_ mancomunad
     * o4.
     */
    public static final double PODER_FIRMA_MANCOMUNADO4 =
        0.25;

    /** The estados todos. */
    public static final String ESTADOS_TODOS =
        "TO";

    /**
     * Longitud que debe tener el numero
     * aleatorio generado (9).
     */
    public static final int LONGITUD_NUM_ALEATORIO =
        9;
    
    /** The IDIOMA_CASH_DEFECTO. */
    public static final String IDIOMA_CASH_DEFECTO =
        "CAS";

    /** Mapa de estados. */
    private static final Map<String, String> MAP_ESTADO_COD =
        new HashMap<String, String>();

    /** Mapa de destados por intenger. */
    private static final Map<String, String> MAP_COD_ESTADO =
        new HashMap<String, String>();

    /** Mapa de acciones por codigo. */
    private static final Map<Integer, String> MAP_COD_ACCION =
        new HashMap<Integer, String>();

    /**
     * Mapa de tipos de orden host por
     * codigo.
     */
    private static final Map<String, String> MAP_CODIGO_ORDEN_HOST =
        new HashMap<String, String>();

    /** The zona euro. */
    private static final List<String> LST_ZONA_EURO =
        new ArrayList<String>();

    /** The multifirma. */
    private static final List<String> LST_MULTIFIRMA =
        new ArrayList<String>();
    
    /** The estados host pendiente. */
    private static List<String> estadosHostPendiente =
        new ArrayList<String>(
            Arrays
                .asList(
                    "0050", "0055"));

    /** The estados posibles host. */
    private static final List<String> estadosHost =
        Arrays
            .asList(
                "0010", "0011", "0012", "0013", "0014", "0015", "0016", "0017",
                "0018", "0019", "0020", "0021", "0022", "0023", "0024", "0025",
                "0026", "0027", "0028", "0029", "0030", "0031", "0032", "0033",
                "0034", "0035", "0036", "0037", "0038", "0039", "0040", "0041",
                "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049",
                "0050", "0051", "0052", "0053", "0054", "0055", "0058", "0062",
                "0063", "0064", "0065", "0066", "0069", "0070", "0071", "0072",
                "0074", "0075", "0076", "0077", "0078", "0090", "0091", "0095",
                "0097", "0098", "0099", "0100", "0200");

    /**
     * The map de estados traceables por
     * tipo de servicio.
     */
    private static Map<String, List<String>> MAP_SERV_TRAZABLES =
        new HashMap<String, List<String>>();

    /**
     * The map campoOrdenacionJava
     * */
    private static final Map<String, String> MAP_CAMPOS_ORDEN =
        new HashMap<String, String>();

    static {

        // Seteamos los posibles valores
        // de los estados.
        MAP_ESTADO_COD
            .put(
                "EC", "001");
        MAP_ESTADO_COD
            .put(
                "PN", "003");
        // MAP_ESTADO_COD.put("PN","002");
        // Se queda el prioritario
        MAP_ESTADO_COD
            .put(
                "EN", "004");
        MAP_ESTADO_COD
            .put(
                "EX", "006");
        MAP_ESTADO_COD
            .put(
                "PD", "011");
        MAP_ESTADO_COD
            .put(
                "PL", "016");
        MAP_ESTADO_COD
            .put(
                "PX", "017");
        MAP_ESTADO_COD
            .put(
                "LI", "018");
        MAP_ESTADO_COD
            .put(
                "FP", "019");
        MAP_ESTADO_COD
            .put(
                "PA", "020");
        MAP_ESTADO_COD
            .put(
                "PE", "021");
        MAP_ESTADO_COD
            .put(
                "HO", "022");
        MAP_ESTADO_COD
            .put(
                "RE", "023");
        MAP_ESTADO_COD
            .put(
                "PF", "024");
        MAP_ESTADO_COD
            .put(
                "EJ", "025");
        MAP_ESTADO_COD
            .put(
                "RF", "026");
        MAP_ESTADO_COD
            .put(
                "EP", "027");
        MAP_ESTADO_COD
            .put(
                "PR", "028");
        MAP_ESTADO_COD
            .put(
                "ER", "029");
        MAP_ESTADO_COD
            .put(
                "PC", "030");
        MAP_ESTADO_COD
            .put(
                "PP", "031");
        MAP_ESTADO_COD
            .put(
                "RA", "032");
        MAP_ESTADO_COD
            .put(
                "FF", "696");
        MAP_ESTADO_COD
            .put(
                "AT", "994");
        MAP_ESTADO_COD
            .put(
                "BM", "995");
        MAP_ESTADO_COD
            .put(
                "BH", "996");
        MAP_ESTADO_COD
            .put(
                "BD", "997");
        // MAP_ESTADO_COD.put("BD","998");
        // Se queda el prioritario
        MAP_ESTADO_COD
            .put(
                "EL", "999");

        // Invertimos el hashmap para la
        // búsqueda contraria
        for (final Entry<String, String> ent : MAP_ESTADO_COD
            .entrySet()) {
            MAP_COD_ESTADO
                .put(
                    ent.getValue(), ent
                        .getKey());
        }
        // Añadimos resultados
        // equivalentes que no pueden
        // salir de la lista
        // anterior
        MAP_COD_ESTADO
            .put(
                "002", "PN");
        MAP_COD_ESTADO
            .put(
                "998", "BD");

        // Mapa para busqueda de
        // acciones
        MAP_COD_ACCION
            .put(
                1, "Creacion");
        MAP_COD_ACCION
            .put(
                2, "Modificacion");
        MAP_COD_ACCION
            .put(
                3, "Validado");
        MAP_COD_ACCION
            .put(
                4, "Firmado");
        MAP_COD_ACCION
            .put(
                5, "Pdte. de Envio");
        MAP_COD_ACCION
            .put(
                6, "Exportado a Disco");
        MAP_COD_ACCION
            .put(
                7, "Enviado");
        MAP_COD_ACCION
            .put(
                8, "Borrada por cliente");
        MAP_COD_ACCION
            .put(
                9, "Auditado");
        MAP_COD_ACCION
            .put(
                10, "Generar Listado");
        MAP_COD_ACCION
            .put(
                11, "Enviado");
        MAP_COD_ACCION
            .put(
                12, "Ejecutado");
        MAP_COD_ACCION
            .put(
                13, "Borrado Definitivo");
        MAP_COD_ACCION
            .put(
                14, "Borrado del Historico");

        MAP_CODIGO_ORDEN_HOST
            .put(
                "ANTI", "CRE");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "CEXT", "TIN");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "CHEQ", "CHE");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "CONF", "CNF");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "CRIM", "CDI");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "CSP", "CSP");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "CTRU", "TRU");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "EFEC", "REM");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "FINO", "CST");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "FITR", "FIM");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "GMS", "GMS");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "NOMI", "NO1");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "PCER", "CPG");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "RECI", "REC");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "SCAR", "SCA");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "STCK", "STK");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "TRAN", "TRA");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "TREC", "RCG");
        MAP_CODIGO_ORDEN_HOST
            .put(
                "TRUN", "TRA");

        // Seateamos los valores de la
        // zona euro.
        LST_ZONA_EURO
            .add("TTG");
        LST_ZONA_EURO
            .add("PPG");
        LST_ZONA_EURO
            .add("NOG");
        LST_ZONA_EURO
            .add("TIG");
        LST_ZONA_EURO
            .add("TIF");
        LST_ZONA_EURO
            .add("TTN");
        LST_ZONA_EURO
            .add("ACN");
        LST_ZONA_EURO
            .add("IAN");
        LST_ZONA_EURO
            .add("PFN");
        LST_ZONA_EURO
            .add("CND");
        LST_ZONA_EURO
            .add("CDI");
        LST_ZONA_EURO
            .add("CDP");

        // Seateamos los valores de la
        // multifirma.
        LST_MULTIFIRMA
            .add("RDM");
        LST_MULTIFIRMA
            .add("RDJ");
        LST_MULTIFIRMA
            .add("RDC");
        LST_MULTIFIRMA
            .add("RDO");
        LST_MULTIFIRMA
            .add("CCB");
        LST_MULTIFIRMA
            .add("RED");
        
        // Mapa para ordenacion mediante
        // codigo de Objetos respuesta
        // (FicheroConfeccion,
        // InfoFileFir)
        MAP_CAMPOS_ORDEN
            .put(
                "TIOR", "sCodTipoOrden");
        MAP_CAMPOS_ORDEN
            .put(
                "DIVI", "sDivisa");
        MAP_CAMPOS_ORDEN
            .put(
                "IMPO", "lImporte");
        MAP_CAMPOS_ORDEN
            .put(
                "NOFI", "sNombreFichero");
        MAP_CAMPOS_ORDEN
            .put(
                "NUOR", "iNumeroOrdenes");
        MAP_CAMPOS_ORDEN
            .put(
                "ESTA", "sCodEstadoFichero");
        MAP_CAMPOS_ORDEN
            .put(
                "ASUN", "sAsunto");
        MAP_CAMPOS_ORDEN
            .put(
                "FECR", "dFechaCreacion");
        MAP_CAMPOS_ORDEN
            .put(
                "FEPR", "dFechaProceso");
    }

    /**
     * Es zona euro.
     * 
     * @param claseOrden
     *            the clase orden
     * @return true, if successful
     */
    public static boolean noEsZonaEuro(final String claseOrden) {
        return !LST_ZONA_EURO
            .contains(claseOrden);
    }
    
    public static boolean incluidaMultifirma(final String claseOrden)
    {
        return LST_MULTIFIRMA
            .contains(claseOrden);
    }

    /**
     * Obtiene la sigla correspondiente
     * al estado que recibe como
     * parametro.
     * 
     * @param nEstado
     *            the n estado
     * @return the cod sigla
     */
    public static String getCodSigla(final String nEstado) {
        return strDefault(MAP_COD_ESTADO
            .get(nEstado));
    }

    /**
     * Obtiene la sigla correspondiente
     * al estado que recibe como
     * parametro.
     * 
     * @param nEstado
     *            the n estado
     * @return the cod Estado cod Host
     */
    public static String getCodEstadoHost(final String nEstado) {
        try {
            return "0"
                + nEstado
                    .substring(
                        0, 3); // Ejemplo:
                               // 011
                               // RECH
                               // ->
                               // Devuelve
                               // 0011
        } catch (IndexOutOfBoundsException e) {
            return nEstado;
        } catch (NullPointerException n) {
            return nEstado;
        }
    }

    /**
     * Obtiene el numero correspondiente
     * a la sigla que recibe como
     * parametro.
     * 
     * @param sEstado
     *            the s estado
     * @return the cod numero
     */
    public static final String getCodNumero(final String sEstado) {
        return strDefault(MAP_ESTADO_COD
            .get(sEstado));
    }

    /**
     * Comprueba si el estado pasado es
     * de host o no.
     * 
     * @param sEstado
     *            the s estado
     * @return true or false
     */
    public static final boolean isEstadoHost(final String sEstado) {
        return estadosHost
            .contains(sEstado);
    }

    /**
     * Obtiene el tipo de orden de
     * distribuidos a partir del de HOST
     * al estado que recibe como
     * parámetro.
     * 
     * @param nEstado
     *            the n estado
     * @return the accion
     */
    public static String getTipoOrden(final String tipoOrden) {
        String aux =
            MAP_CODIGO_ORDEN_HOST
                .get(tipoOrden);
        if (aux == null) {
            aux =
                tipoOrden;
        }
        return aux;
    }

    /**
     * Obtiene la accion correspondiente
     * al estado que recibe como
     * parámetro.
     * 
     * @param nEstado
     *            the n estado
     * @return the accion
     */
    public static String getAccion(final int nEstado) {
        return strDefault(MAP_COD_ACCION
            .get(nEstado));
    }

    /**
     * Comprueba el String y en caso de
     * que sea null devuelve "".
     * 
     * @param str
     *            the str
     * @return the string
     */
    private static String strDefault(final String str) {
        return str == null
            ? "" : str;
    }

    /**
     * Devuelve el campo de ordenacion.
     * 
     * @param campo
     *            the campo
     * @param tipoPeticion
     *            the tipo peticion
     * @return the string
     */
    public static String getCampoOrdenSQL(final String campo,
        final int tipoPeticion) {

        String campoOrden =
            strDefaultOrdenacion(
                campo, tipoPeticion, Constantes.TIPO_ORDENACION.SQL);

        if (tipoPeticion != Constantes.PET_AUDITORIA
            && campo != null) {
            // Ordenacion por campos que
            // no son los de por defecto
            if (campo
                .equals("FECR")) {
                campoOrden =
                    "TIM_FICHERO";
            } else if (campo
                .equals("FEPR")) {
                campoOrden =
                    "FEC_PROCESCA";
            } else if (campo
                .equals("TIOR")) { // Tipo
                                   // Orden
                                   // (Campo
                                   // comun
                                   // entre
                                   // tipos
                                   // de
                                   // peticion)
                campoOrden =
                    "COD_CLASEORD";
            } else if (campo
                .equals("DIVI")) { // Divisa
                                   // (Campo
                                   // comun
                                   // entre
                                   // tipos
                                   // de
                                   // peticion)
                campoOrden =
                    "COD_ABREVIAT";
            } else if (campo
                .equals("IMPO")) { // Importe
                                   // (Campo
                                   // comun
                                   // entre
                                   // tipos
                                   // de
                                   // peticion)
                campoOrden =
                    "QTY_TOTIMP";
            } else if (campo
                .equals("NOFI")) { // Nombre
                                   // Fichero
                                   // (Campo
                                   // comun
                                   // entre
                                   // tipos
                                   // de
                                   // peticion)
                campoOrden =
                    "DES_NOMFICH";
            } else if (campo
                .equals("NUOR")) { // Numero
                                   // Ordenes
                                   // (Campo
                                   // comun
                                   // entre
                                   // tipos
                                   // de
                                   // peticion)
                campoOrden =
                    "QNU_TOTREGIS";
            } else if (campo
                .equals("ESTA")) { // Estado
                                   // (Campo
                                   // dependiente
                                   // segun
                                   // tipos
                                   // de
                                   // peticion)
                if (tipoPeticion == Constantes.PET_PENDIENTE) {
                    campoOrden =
                        "COD_ESTADODS";
                } else if (tipoPeticion == Constantes.PET_HISTORICO
                    || tipoPeticion == Constantes.PET_CONFECCION) {
                    campoOrden =
                        "COD_ESTACASH";
                }
            } else if (campo
                .equals("ASUN")) { // Asunto
                                   // (Campo
                                   // dependiente
                                   // segun
                                   // tipos
                                   // de
                                   // peticion)
                if (tipoPeticion == Constantes.PET_PENDIENTE) {
                    campoOrden =
                        "DES_ASUNACCE";
                } else if (tipoPeticion == Constantes.PET_HISTORICO
                    || tipoPeticion == Constantes.PET_CONFECCION) {
                    campoOrden =
                        "DES_CUENORIG";
                }
            }
        }

        return campoOrden;
    }

    /**
     * Convertir fechas tx to bbdd.
     * 
     * @param listaFechasTx
     *            the lista fechas tx
     * @return the list
     * @throws ParseException
     *             the parse exception
     */
    public static List<String> convertirFechasTxToBBDD(
        final List<String> listaFechasTx) throws ParseException {

        final SimpleDateFormat sdf =
            new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss.SSS");
        final SimpleDateFormat sdf2 =
            new SimpleDateFormat(
                "yyyy-MM-dd-HH.mm.ss.SSS");
        final List<String> listaFechaBBDD =
            new ArrayList<String>();

        for (String fechaTx : listaFechasTx) {
            if (fechaTx
                .length() > 23) {
                fechaTx =
                    fechaTx
                        .substring(
                            0, 23);
            }
            final Date fechaTxd =
                sdf2.parse(fechaTx);
            listaFechaBBDD
                .add(String
                    .valueOf(sdf
                        .format(fechaTxd)));
        }

        return listaFechaBBDD;
    }

    /**
     * Metodo que convierte la fecha en
     * formato de la bbdd y la convierte
     * en fotmato de TX.
     * 
     * @param fechaBBDD
     *            the fecha bbdd
     * @return String fechaTX
     */
    public static String convertirFechasBBDDToTx(final String fechaBBDD) {

        final SimpleDateFormat sdf =
            new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss.SSS");
        final SimpleDateFormat sdf2 =
            new SimpleDateFormat(
                "yyyy-MM-dd-HH.mm.ss.SSS");
        String fechaTX =
            null;
        try {
            final Date fechaTxd =
                sdf.parse(fechaBBDD);
            fechaTX =
                String
                    .valueOf(
                        sdf2.format(fechaTxd)).concat(
                        "000");
        } catch (final ParseException e) {
            fechaTX =
                fechaBBDD
                    .concat("000");
        }

        return fechaTX;
    }

    /**
     * Error
     * @param eea
     *            the eea
     * @param ce
     *            the ce
     * @return true, if successful
     */
    public static boolean eqError(final ExcepcionEjecucionAplicacion eea,
        final CodigoError ce) {
        return eea
            .getCodigoError().toString().equals(
                ce.toString());
    }

    /**
     * Comparamos la fecha con null, y
     * operamos segun delta.
     * 
     * @param fecha
     *            the fecha
     * @param delta
     *            the delta
     * @return Date fecha
     */
    public static Date addOrsubtractsDate(final Date fecha, final int delta) {
        Date resp;
        if (fecha != null) {
            final Calendar calendar =
                Calendar
                    .getInstance();
            calendar
                .setTime(fecha);
            calendar
                .add(
                    Calendar.DATE, delta);
            resp =
                calendar
                    .getTime();
        } else {
            resp =
                null;
        }
        return resp;
    }

    /**
     * Gets the lista estados host
     * pendientes.
     * 
     * @return the lista estados host
     *         pendientes
     */
    public static List<String> getListaEstadosHostPendientes() {
        return estadosHostPendiente;
    }

    /**
     * Convertir fechas tx to bbdd.
     * 
     * @param fechaTx
     *            the fecha tx
     * @return the string
     * @throws ParseException
     *             the parse exception
     */
    public static String convertirFechasTxToBBDD(final String fechaTx)
        throws ParseException {
        String fechaTxAux =
            fechaTx;
        final SimpleDateFormat sdf =
            new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss.SSS");
        final SimpleDateFormat sdf2 =
            new SimpleDateFormat(
                "yyyy-MM-dd-HH.mm.ss.SSS");
        if (fechaTx
            .length() > 23) {
            fechaTxAux =
                fechaTxAux
                    .substring(
                        0, 23);
        }
        Date fechaTxd =
            sdf2.parse(fechaTxAux);

        return String
            .valueOf(sdf
                .format(fechaTxd));
    }

    /**
     * Método que calcula el peso de la
     * firma
     * 
     * @param codAccion
     *            indica la acción que
     *            se va a realizar
     * @param codUsuPoder
     *            es el poder de firma
     *            que tiene el usuario
     * @return el número del peso de la
     *         firma del código usuario
     *         poder teniendo en cuenta
     *         el código de acción
     *         devuelve 0 en el caso que
     *         no se pase la condición
     *         de acción 4 o 9
     */
    public static Double calcularPeso(Short codAccion, String codUsuPoder) {
        Double dPeso =
            0d;
        try {
            // Para el caso firmado
            if (codAccion == 4) {
                // comprobamos el peso
                // de la firma
                if (Util.FIRMA_MANCOMUNADO2
                    .equals(codUsuPoder)) {
                    dPeso =
                        Util.PODER_FIRMA_MANCOMUNADO2;
                } else if (Util.FIRMA_MANCOMUNADO3
                    .equals(codUsuPoder)) {
                    dPeso =
                        Util.PODER_FIRMA_MANCOMUNADO3;
                } else if (Util.FIRMA_MANCOMUNADO4
                    .equals(codUsuPoder)) {
                    dPeso =
                        Util.PODER_FIRMA_MANCOMUNADO4;
                } else if (Util.FIRMA_SOLIDARIO
                    .equals(codUsuPoder)) {
                    dPeso =
                        1d;
                }
            }
            // Para el caso de auditado
            else if (codAccion == 9) {
                dPeso =
                    1d;
            }
        } catch (Exception e) {
            // En caso de dar alguna
            // excepción, devolvemos
            // cero
            dPeso =
                0d;
        }
        return dPeso;
    }

    /**
     * Cargar estados trazables.
     * 
     * @param mapaEstadosTrazables
     *            the mapa estados
     *            trazables
     */
    public static void cargarEstadosTrazables(
        Map<String, List<String>> mapaEstadosTrazables) {
        MAP_SERV_TRAZABLES =
            mapaEstadosTrazables;
    }

    /**
     * Gets the estados trazables.
     * 
     * @return the estados trazables
     */
    public static Map<String, List<String>> getEstadosTrazables() {
        return MAP_SERV_TRAZABLES;
    }

    /**
     * Comprueba si el estado pasado es
     * de trazable por el servicio.
     * 
     * @param servicio
     *            the servicio
     * @param estado
     *            the estado
     * @return true or false
     */
    public static boolean isEstadoTrazable(final String servicio,
        final String estado) {
        List<String> listaTrazables =
            MAP_SERV_TRAZABLES
                .get(servicio);
        return listaTrazables != null
            && listaTrazables
                .contains(estado);
    }

    /**
     * Checks if is ficheros corruptos.
     * 
     * @return true, if is ficheros
     *         corruptos
     */
    public static boolean isFicherosCorruptos() {
        boolean insertarCorruptos =
            false;

        try {
            insertarCorruptos =
                ArqSpringContext
                    .getPropiedadBoolean(Constantes.CORRUPTOS_HOST);
        } catch (PropiedadNoEncontradaExcepcion e) {
            LOG.error("Util -- variable insertarCorruptos no encontrada");
        } catch (PropiedadNoParseableExcepcion e) {
            LOG.error("Util -- variable insertarCorruptos no parseable");
        }

        return insertarCorruptos;
    }

    /**
     * 
     * 
     * @param sEstado
     *            the s estado
     * @return the cod numero
     */
    public static final String getCampoOrdenJava(final String peticionOrden,
        final int tipoPeticion) {
        return strDefaultOrdenacion(
            MAP_CAMPOS_ORDEN.get(peticionOrden), tipoPeticion,
            Constantes.TIPO_ORDENACION.DTO);
    }

    /**
     * Comprueba el String y en caso de
     * que sea null devuelve el nombre
     * del campo de ordenacion por
     * defecto (A nivel SQL)
     * 
     * @param str
     * @return
     */
    private static String
        strDefaultOrdenacion(final String ordenacion, final int tipoPeticion,
            final Constantes.TIPO_ORDENACION tipoOrdenacion) {
        String campoOrden =
            "";

        // Ordenacion por campos por
        // defecto
        if (ordenacion == null) {
            switch (tipoPeticion) {
            case Constantes.PET_PENDIENTE:
                campoOrden =
                    tipoOrdenacion == Constantes.TIPO_ORDENACION.SQL
                        ? "TIM_FICHERO" : "dFechaCreacion";
                break;
            case Constantes.PET_CONFECCION:
            case Constantes.PET_HISTORICO:
                campoOrden =
                    tipoOrdenacion == Constantes.TIPO_ORDENACION.SQL
                        ? "FEC_PROCESCA" : "dFechaProceso";
                break;
            case Constantes.PET_AUDITORIA:
                campoOrden =
                    tipoOrdenacion == Constantes.TIPO_ORDENACION.SQL
                        ? "F.AUD_FMODIFIC, F.FEC_ACCION2" : "";
            }
        } else {
            campoOrden =
                ordenacion;
        }
        return campoOrden;
    }

}
